package br.ufrn.cerescaico.sepe.bo;

import br.ufrn.cerescaico.sepe.Sepe;
import br.ufrn.cerescaico.sepe.beans.Email;
import br.ufrn.cerescaico.sepe.beans.Participante;
import br.ufrn.cerescaico.sepe.beans.Trabalho;
import br.ufrn.cerescaico.sepe.dao.Dao;
import br.ufrn.cerescaico.sepe.dao.TrabalhoDao;
import br.ufrn.cerescaico.sepe.dao.util.DataAccessLayerException;
import br.ufrn.cerescaico.sepe.dao.util.PagerBean;
import br.ufrn.cerescaico.sepe.email.MailManager;
import br.ufrn.cerescaico.sepe.email.MailMessage;
import br.ufrn.cerescaico.sepe.util.Constantes;
import java.util.Date;
import java.util.List;
import org.apache.log4j.Logger;

/**
 * Classe de negócio do bean {@link Trabalho} do sistema Sepe.
 * @author Taciano Morais Silva
 * @version 16/08/2010, 21h23m
 * @since 16/08/2010, 21h23m
 */
public class TrabalhoBO extends AbstractBO {

    /**
     * Logger.
     */
    private Logger logger = Logger.getLogger(TrabalhoBO.class);

    /**
     *
     * @param Sepe
     */
    public TrabalhoBO(Sepe Sepe) {
        super(Sepe);
    }

    /**
     * Pesquisa de trabalho som filtros com paginação.
     * @param pager Os dados da paginação.
     * @return A lista paginada de trabalhos.
     * @throws SepeException Caso ocorra erro de acesso aos dados.
     */
    public List<Trabalho> listar(PagerBean pager) throws SepeException {
        try {
            TrabalhoDao dao = new TrabalhoDao();
            return dao.listar(pager);
        } catch (DataAccessLayerException ex) {
            logger.error(ex.getMessage(), ex);
            throw new SepeException("erro.trabalho.bo.listar", ex);
        }
    }

    /**
     * Incluir uma proposição de trabalho no sistema.
     * @param trabalho O trabalho a ser incluído.
     */
    public void submeter(Trabalho trabalho) throws SepeException {
        verificarNull(trabalho);
        verificarParticipante(trabalho);
        try {
            Dao<Trabalho> dao = new TrabalhoDao();
            trabalho.setDataSubmissaoTrabalho(new Date());
            dao.create(trabalho);
        } catch (DataAccessLayerException ex) {
            logger.error(ex.getMessage(), ex);
            throw new SepeException("erro.bo.trabalho.submeter", ex);
        }
        enviarEmail(trabalho);
    }

    private void enviarEmail(Trabalho trab) throws SepeException {
        Email mail = new Email();
        mail.setDestino(trab.getPrimeiroAutorEmail());
        mail.setAssunto("[II SEPE CERES/UFRN] Confirmação de Submissão de Trabalho");
        mail.setConteudo(msg(trab));

        MailMessage mailMessage = getMailMessage(mail);
        MailManager m = new MailManager();

        try {
            m.send(mailMessage);
            EmailBO emailBO = new EmailBO(getSepe());
            emailBO.incluir(mail);
        } catch (Exception ex) {
            logger.error("erro.trabalho.bo.incluir.email.naoenviado", ex);
            throw new SepeException("erro.trabalho.bo.incluir.email.naoenviado");
        }
    }

    private String msg(Trabalho trab) {
        String msg = "Prezado(a) " + trab.getPrimeiroAutorNome() + ",\n\n";
        msg += "Os dados de submissão do trabalho cadastrado em nossa base de dados s\u00e3o os seguinte: \n";
        msg += "      - E-mail: " + trab.getPrimeiroAutorEmail() + "\n";
        msg += "      - Título: " + trab.getTitulo() + "\n";
        msg += "      - Área: " + trab.getArea() + "\n";
        msg += "      - Categoria: " + trab.getCategoria() + "\n";
        msg += "      - Senha: " + trab.getParticipante().getSenha() + "\n\n";
        msg += "      - Arquivo: " + trab.getFileTrabalho() + "\n\n";
        msg += "Para mais informa\u00e7\u00f5es sobre a II Semana de Ensino, Pesquisa e Extensão do CERES/UFRN, por favor, \n"
                + "reporte-se ao portal web do evento (" + Constantes.SITE + ").\n\n";
        msg += "Em breve você poderá atualizar seu cadastro e verificar o status do seu trabalho!\n\n";
        msg += "Atenciosamente,\n";
        msg += "Comiss\u00e3o Organizadora II SEPE.";
        return msg;
    }

    private void verificarNull(Object obj) throws SepeException {
        if (obj == null) {
            throw new SepeException("erro.bo.trabalho.null");
        }
    }

    private void verificarParticipante(Trabalho trabalho) throws SepeException {
        ParticipanteBO bo = new ParticipanteBO(getSepe());
        Participante participante = bo.buscar(trabalho.getPrimeiroAutorEmail());
        if (participante == null) {
            throw new SepeException("erro.bo.trabalho.participante.naocadastrado");
        }
        if (!participante.getSenha().equals(trabalho.getParticipante().getSenha())) {
            throw new SepeException("erro.bo.trabalho.participante.senha.incorreta");
        }
        trabalho.setParticipante(participante);
    }

}
